{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "informed-integrity",
   "metadata": {},
   "source": [
    "## 手动计算knn算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "descending-rally",
   "metadata": {},
   "outputs": [],
   "source": [
    "#全部行都能输出 \n",
    "from IPython.core.interactiveshell import InteractiveShell \n",
    "InteractiveShell.ast_node_interactivity = \"all\" \n",
    "import numpy as np \n",
    "import pandas as pd \n",
    "import matplotlib.pyplot as plt \n",
    "# 解决坐标轴刻度负号乱码 \n",
    "plt.rcParams['axes.unicode_minus'] = False \n",
    "# 解决中文乱码问题 \n",
    "plt.rcParams['font.sans-serif'] = ['Simhei'] \n",
    "plt.style.use('ggplot') \n",
    "# plt.figure(figsize=(2,3),dpi=720)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "chubby-playlist",
   "metadata": {},
   "source": [
    "构建已经分类好的原始数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "wooden-sharing",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>颜色深度</th>\n",
       "      <th>酒精浓度</th>\n",
       "      <th>品种</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>14.13</td>\n",
       "      <td>5.64</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>13.20</td>\n",
       "      <td>4.28</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>13.16</td>\n",
       "      <td>5.68</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14.27</td>\n",
       "      <td>4.80</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>13.24</td>\n",
       "      <td>4.22</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>12.07</td>\n",
       "      <td>2.76</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>12.43</td>\n",
       "      <td>3.94</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>11.79</td>\n",
       "      <td>3.10</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>12.37</td>\n",
       "      <td>2.12</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>12.04</td>\n",
       "      <td>2.60</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    颜色深度  酒精浓度  品种\n",
       "0  14.13  5.64   0\n",
       "1  13.20  4.28   0\n",
       "2  13.16  5.68   0\n",
       "3  14.27  4.80   0\n",
       "4  13.24  4.22   0\n",
       "5  12.07  2.76   1\n",
       "6  12.43  3.94   1\n",
       "7  11.79  3.10   1\n",
       "8  12.37  2.12   1\n",
       "9  12.04  2.60   1"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 随机设置十个样本点表示十杯酒\n",
    "rowdata = {'颜色深度': [14.13,13.2,13.16,14.27,13.24,12.07,12.43,11.79,12.37,12.04], \n",
    "           '酒精浓度': [5.64,4.28,5.68,4.80,4.22,2.76,3.94,3.1,2.12,2.6], \n",
    "           '品种': [0,0,0,0,0,1,1,1,1,1]} \n",
    "# 0 代表 “黑皮诺”，1 代表 “赤霞珠” wine_data = pd.DataFrame(rowdata) wine_data\n",
    "wine_data = pd.DataFrame(rowdata) \n",
    "wine_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "moral-evolution",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=int64)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.array(wine_data.iloc[:,0:2]) #我们把特征（酒的属性）放在X \n",
    "y = np.array(wine_data.iloc[:,-1]) #把标签（酒的类别）放在Y\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "bright-south",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x138b543cba8>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x138b543cb38>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x138b542e828>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, '颜色深度')"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x138b543c908>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#探索数据，假如我们给出新数据[12.3,4.1] ，你能猜出这杯红酒是什么类别么? \n",
    "new_data = np.array([12.3,4.1]) \n",
    "plt.scatter(X[y==1,0], X[y==1,1], color='red', label='赤霞珠') \n",
    "#画出标签y为1 的、关于“赤霞珠”的散点 \n",
    "\n",
    "plt.scatter(X[y==0,0], X[y==0,1], color='purple', label='黑皮诺') \n",
    "#画出标签y为0 的、关于“黑皮诺”的散点 \n",
    "\n",
    "plt.scatter(new_data[0],new_data[1], color='yellow') \n",
    "# 新数据点 new_data plt.xlabel('酒精浓度') \n",
    "\n",
    "plt.ylabel('颜色深度') \n",
    "plt.legend(loc='lower right') \n",
    "plt.savefig('葡萄酒样本.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "deadly-registrar",
   "metadata": {},
   "source": [
    "计算已知类别数据集中的点与当前点之间的距离"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "theoretical-middle",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2.3917566765873155,\n",
       " 0.9178235124466999,\n",
       " 1.7988885457415085,\n",
       " 2.0906697491473865,\n",
       " 0.9476286192385702,\n",
       " 1.3595955280891445,\n",
       " 0.20615528128088217,\n",
       " 1.122541758688736,\n",
       " 1.98123698733897,\n",
       " 1.522366578718805]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# (1）第一种方式\n",
    "from math import sqrt\n",
    "distance = [sqrt(np.sum((x-new_data)**2)) for x in X ] \n",
    "distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "prescribed-hazard",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2.39175668, 0.91782351, 1.79888855, 2.09066975, 0.94762862,\n",
       "       1.35959553, 0.20615528, 1.12254176, 1.98123699, 1.52236658])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#第二种方式，广播的方式？？？\n",
    "data = wine_data.iloc[:,:2].values#将前两列去取出来\n",
    "a = ((np.array([[12.3,4.1]])-data) **2)[:,0]#将第一列取出来\n",
    "b = ((np.array([[12.3,4.1]])-data) **2)[:,1]#将第二列取出来\n",
    "np.sqrt(a+b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "characteristic-security",
   "metadata": {},
   "source": [
    "将距离升序排列，然后选取距离最小的k个点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "bridal-import",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([6, 1, 4, 7, 5, 9, 2, 8, 3, 0], dtype=int64)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sort_dist = np.argsort(distance) #得到开始表的索引值\n",
    "sort_dist"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "lyric-black",
   "metadata": {},
   "source": [
    "6、7、4为最近的3个“数据点”的索引值，那么这些索引值对应的原数据的标签是什么？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "adjacent-phoenix",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 0, 0]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k = 3 \n",
    "topK = [y[i] for i in sort_dist[:k]] \n",
    "topK"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "black-program",
   "metadata": {},
   "source": [
    "判断类别，确定前k个点所在类别的计数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "banner-indianapolis",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.Series(topK).value_counts().idxmax()  #返回最大的类别"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "functional-diabetes",
   "metadata": {},
   "source": [
    "## 封装函数计算knn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "purple-gentleman",
   "metadata": {},
   "outputs": [],
   "source": [
    "def KNN(new_data,dataSet,k): \n",
    "    ''' 函数功能：KNN分类器 参数说明： \n",
    "    new_data: 需要预测分类的数据集 \n",
    "    dataSet: 已知分类标签的数据集 \n",
    "    k: k-近邻算法参数，选择距离最小的k个点 \n",
    "    return: result: 分类结果 ''' \n",
    "    from math import sqrt \n",
    "    from collections import Counter \n",
    "    import numpy as np \n",
    "    import pandas as pd \n",
    "    result = [] \n",
    "    distance = [sqrt(np.sum((x-new_data)**2)) for x in np.array(dataSet.iloc[:,0:2])] \n",
    "    sort_dist = np.argsort(distance) \n",
    "    topK = [dataSet.iloc[:,-1][i] for i in sort_dist[:k]] \n",
    "    result.append(pd.Series(topK).value_counts().index[0]) \n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "prerequisite-truck",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0]"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 测试函数的运行结果 \n",
    "new_data=np.array([12.3,4.1]) \n",
    "k = 3 \n",
    "KNN(new_data,wine_data,k)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "damaged-filling",
   "metadata": {},
   "source": [
    "可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "stuck-shield",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[14.13,  5.64],\n",
       "       [13.2 ,  4.28],\n",
       "       [13.16,  5.68],\n",
       "       [14.27,  4.8 ],\n",
       "       [13.24,  4.22],\n",
       "       [12.07,  2.76],\n",
       "       [12.43,  3.94],\n",
       "       [11.79,  3.1 ],\n",
       "       [12.37,  2.12],\n",
       "       [12.04,  2.6 ]])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=int64)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.array(wine_data.iloc[:,0:2]) #我们把特征（酒的属性）放在X \n",
    "y = np.array(wine_data.iloc[:,-1]) #把标签（酒的类别）放在Y\n",
    "X\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "little-rover",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([12.07, 12.43, 11.79, 12.37, 12.04])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X[y == 1,0]#！！！！那么厉害呢，返回y=1的X的第0列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "commercial-wright",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x138ba774518>"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x138ba7577f0>"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x138ba713ba8>"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x138ba7574e0>"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "new_data = np.array([12.01,4.1])\n",
    "plt.scatter(X[y == 1,0],X[y == 1,1],color = 'red',label='赤霞珠')\n",
    "plt.scatter(X[y == 0,0],X[y == 0,1],color = 'purple',label='黑皮诺')\n",
    "plt.scatter(new_data[0],new_data[1],color = 'yellow')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aggressive-element",
   "metadata": {},
   "source": [
    "## sklearn方式实现"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "agreed-hardware",
   "metadata": {},
   "source": [
    "### 案例1：红酒"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "contemporary-interface",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0], dtype=int64)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier \n",
    "# 0 代表 “黑皮诺”，1 代表 “赤霞珠” \n",
    "clf = KNeighborsClassifier(n_neighbors = 3) #-----默认的k为5\n",
    "clf = clf.fit(wine_data.iloc[:,0:2], wine_data.iloc[:,-1])\n",
    "result = clf.predict([[12.8,4.1]]) # 返回预测的标签 \n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "published-montgomery",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 对模型进行一个评估，接口score返回预测的准确率 \n",
    "score = clf.score([[12.8,4.1]],[0]) \n",
    "score #----准确率100%"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "combined-effects",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.66666667, 0.33333333]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.predict_proba([[12.8,4.1]]) \n",
    "#!!!!输出数据[12.8,4.1]为标签0的概率（0.666...），以及标签为1的概率（0.333...）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "hearing-suffering",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0], dtype=int64)"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.predict([[12.8,4.1]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "fluid-point",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[11.79035106,  4.72304866],\n",
       "       [10.94075562,  3.35444455],\n",
       "       [12.82069474,  4.24447238],\n",
       "       [11.6566517 ,  3.81007236],\n",
       "       [ 7.62916888,  5.11040712],\n",
       "       [ 9.73180337,  4.89504113],\n",
       "       [ 8.38777808,  5.27353886],\n",
       "       [11.79022587,  4.10107946],\n",
       "       [11.13800103,  5.20355322],\n",
       "       [ 8.77014359,  5.203874  ]])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#生成10个黄点\n",
    "a = np.random.normal(11,2,(10,1))#------方差为2\n",
    "b = np.random.normal(5,1,(10,1))#------方差为1\n",
    "new_data = np.concatenate([a,b],axis = 1)\n",
    "new_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "former-union",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 0, 1, 1, 1, 1, 1, 1, 1], dtype=int64)"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.predict(new_data) #----拿到模型预测的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "mature-technology",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_new = np.array([1, 1, 0, 1, 1, 1, 1, 1, 1, 1])  #实际的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "approximate-savannah",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.score(new_data,y_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "increased-belief",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.66666667, 0.33333333],\n",
       "       [0.        , 1.        ],\n",
       "       [0.66666667, 0.33333333],\n",
       "       [0.        , 1.        ],\n",
       "       [0.        , 1.        ],\n",
       "       [0.        , 1.        ],\n",
       "       [0.        , 1.        ],\n",
       "       [0.        , 1.        ],\n",
       "       [0.33333333, 0.66666667],\n",
       "       [0.        , 1.        ]])"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.predict_proba(new_data) #----分别输出10个点，为0（左边一列）和1（右边一列）的概率"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "further-hearing",
   "metadata": {},
   "source": [
    "### 案例2：乳腺癌"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "british-bridal",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier \n",
    "from sklearn.datasets import load_breast_cancer \n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "inside-asian",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>平均半径</th>\n",
       "      <th>平均纹理</th>\n",
       "      <th>平均周长</th>\n",
       "      <th>平均面积</th>\n",
       "      <th>平均光滑度</th>\n",
       "      <th>平均紧凑度</th>\n",
       "      <th>平均凹度</th>\n",
       "      <th>平均凹点</th>\n",
       "      <th>平均对称</th>\n",
       "      <th>平均分形维数</th>\n",
       "      <th>...</th>\n",
       "      <th>最差纹理</th>\n",
       "      <th>最差的边界</th>\n",
       "      <th>最差的区域</th>\n",
       "      <th>最差的平滑度</th>\n",
       "      <th>最差的紧凑性</th>\n",
       "      <th>最差的凹陷</th>\n",
       "      <th>最差的凹点</th>\n",
       "      <th>最差的对称性</th>\n",
       "      <th>最差的分形维数</th>\n",
       "      <th>患病否</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.11840</td>\n",
       "      <td>0.27760</td>\n",
       "      <td>0.3001</td>\n",
       "      <td>0.14710</td>\n",
       "      <td>0.2419</td>\n",
       "      <td>0.07871</td>\n",
       "      <td>...</td>\n",
       "      <td>17.33</td>\n",
       "      <td>184.60</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>0.1622</td>\n",
       "      <td>0.6656</td>\n",
       "      <td>0.7119</td>\n",
       "      <td>0.2654</td>\n",
       "      <td>0.4601</td>\n",
       "      <td>0.11890</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.08474</td>\n",
       "      <td>0.07864</td>\n",
       "      <td>0.0869</td>\n",
       "      <td>0.07017</td>\n",
       "      <td>0.1812</td>\n",
       "      <td>0.05667</td>\n",
       "      <td>...</td>\n",
       "      <td>23.41</td>\n",
       "      <td>158.80</td>\n",
       "      <td>1956.0</td>\n",
       "      <td>0.1238</td>\n",
       "      <td>0.1866</td>\n",
       "      <td>0.2416</td>\n",
       "      <td>0.1860</td>\n",
       "      <td>0.2750</td>\n",
       "      <td>0.08902</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.10960</td>\n",
       "      <td>0.15990</td>\n",
       "      <td>0.1974</td>\n",
       "      <td>0.12790</td>\n",
       "      <td>0.2069</td>\n",
       "      <td>0.05999</td>\n",
       "      <td>...</td>\n",
       "      <td>25.53</td>\n",
       "      <td>152.50</td>\n",
       "      <td>1709.0</td>\n",
       "      <td>0.1444</td>\n",
       "      <td>0.4245</td>\n",
       "      <td>0.4504</td>\n",
       "      <td>0.2430</td>\n",
       "      <td>0.3613</td>\n",
       "      <td>0.08758</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.14250</td>\n",
       "      <td>0.28390</td>\n",
       "      <td>0.2414</td>\n",
       "      <td>0.10520</td>\n",
       "      <td>0.2597</td>\n",
       "      <td>0.09744</td>\n",
       "      <td>...</td>\n",
       "      <td>26.50</td>\n",
       "      <td>98.87</td>\n",
       "      <td>567.7</td>\n",
       "      <td>0.2098</td>\n",
       "      <td>0.8663</td>\n",
       "      <td>0.6869</td>\n",
       "      <td>0.2575</td>\n",
       "      <td>0.6638</td>\n",
       "      <td>0.17300</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10030</td>\n",
       "      <td>0.13280</td>\n",
       "      <td>0.1980</td>\n",
       "      <td>0.10430</td>\n",
       "      <td>0.1809</td>\n",
       "      <td>0.05883</td>\n",
       "      <td>...</td>\n",
       "      <td>16.67</td>\n",
       "      <td>152.20</td>\n",
       "      <td>1575.0</td>\n",
       "      <td>0.1374</td>\n",
       "      <td>0.2050</td>\n",
       "      <td>0.4000</td>\n",
       "      <td>0.1625</td>\n",
       "      <td>0.2364</td>\n",
       "      <td>0.07678</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    平均半径   平均纹理    平均周长    平均面积    平均光滑度    平均紧凑度    平均凹度     平均凹点    平均对称  \\\n",
       "0  17.99  10.38  122.80  1001.0  0.11840  0.27760  0.3001  0.14710  0.2419   \n",
       "1  20.57  17.77  132.90  1326.0  0.08474  0.07864  0.0869  0.07017  0.1812   \n",
       "2  19.69  21.25  130.00  1203.0  0.10960  0.15990  0.1974  0.12790  0.2069   \n",
       "3  11.42  20.38   77.58   386.1  0.14250  0.28390  0.2414  0.10520  0.2597   \n",
       "4  20.29  14.34  135.10  1297.0  0.10030  0.13280  0.1980  0.10430  0.1809   \n",
       "\n",
       "    平均分形维数  ...   最差纹理   最差的边界   最差的区域  最差的平滑度  最差的紧凑性   最差的凹陷   最差的凹点  \\\n",
       "0  0.07871  ...  17.33  184.60  2019.0  0.1622  0.6656  0.7119  0.2654   \n",
       "1  0.05667  ...  23.41  158.80  1956.0  0.1238  0.1866  0.2416  0.1860   \n",
       "2  0.05999  ...  25.53  152.50  1709.0  0.1444  0.4245  0.4504  0.2430   \n",
       "3  0.09744  ...  26.50   98.87   567.7  0.2098  0.8663  0.6869  0.2575   \n",
       "4  0.05883  ...  16.67  152.20  1575.0  0.1374  0.2050  0.4000  0.1625   \n",
       "\n",
       "   最差的对称性  最差的分形维数  患病否  \n",
       "0  0.4601  0.11890  0.0  \n",
       "1  0.2750  0.08902  0.0  \n",
       "2  0.3613  0.08758  0.0  \n",
       "3  0.6638  0.17300  0.0  \n",
       "4  0.2364  0.07678  0.0  \n",
       "\n",
       "[5 rows x 31 columns]"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd \n",
    "import numpy as np \n",
    "#读取数据集 \n",
    "data = load_breast_cancer() \n",
    "\n",
    "#DateFrame格式显示 \n",
    "X = data.data \n",
    "y = data.target \n",
    "name = ['平均半径','平均纹理','平均周长','平均面积', \n",
    "        '平均光滑度','平均紧凑度','平均凹度',\n",
    "        '平均凹点','平均对称','平均分形维数',\n",
    "        '半径误差','纹理误差','周长误差','面积误差',\n",
    "        '平滑度误差','紧凑度误差','凹度误差',\n",
    "        '凹点误差','对称误差', \n",
    "        '分形维数误差','最差半径','最差纹理',\n",
    "        '最差的边界','最差的区域','最差的平滑度', \n",
    "        '最差的紧凑性','最差的凹陷','最差的凹点', \n",
    "        '最差的对称性','最差的分形维数','患病否'] \n",
    "data=np.concatenate((X,y.reshape(-1,1)),axis=1) \n",
    "table=pd.DataFrame(data=data,columns=name) \n",
    "table.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "downtown-hearts",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9210526315789473"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 划分训练集和测试集 #30%数据作为训练集 \n",
    "Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.2,random_state=420) #20%作为测试集。随机种子\n",
    "# 建立模型&评估模型 \n",
    "clf = KNeighborsClassifier(n_neighbors=4) \n",
    "# 建立分类器 \n",
    "clf = clf.fit(Xtrain,Ytrain) \n",
    "score = clf.score(Xtest,Ytest) \n",
    "score#----92%的准确率"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "coordinate-definition",
   "metadata": {},
   "source": [
    "如何用上面分类器拟合结果找出离 Xtest 中第 20 行和第 30 行最近的 4 个“点”?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "smaller-spine",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[35.70015941, 42.02374599, 81.82147557, 83.06271326],\n",
       "        [11.81126721, 14.5871725 , 17.4734004 , 18.94892695]]),\n",
       " array([[112, 221, 303, 263],\n",
       "        [268, 162,  42, 134]], dtype=int64))"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查找点的K邻居。返回每个点的邻居的与之的距离和索引值。 \n",
    "clf.kneighbors(Xtest[[20,30],:],return_distance=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "canadian-summary",
   "metadata": {},
   "source": [
    "选择最优k值-----通过参数学习曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "alpine-retro",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x138c19a1080>]"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#绘制学习曲线\n",
    "score = [ ] \n",
    "krange = range(1,20) \n",
    "for i in krange: \n",
    "    clf = KNeighborsClassifier(n_neighbors=i) \n",
    "    clf = clf.fit(Xtrain,Ytrain) \n",
    "    score.append(clf.score(Xtest,Ytest)) \n",
    "plt.plot(krange,score) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "institutional-sally",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#究竟上图中k为多少的时候分数越高？\n",
    "score.index(max(score))+1\n",
    "# 但是这个时候会有个问题，如果随机划分的数据集变化的的话，得分最高的k值也会发生变化"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "legal-louisiana",
   "metadata": {},
   "source": [
    "###  交叉验证"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "sustained-lending",
   "metadata": {},
   "source": [
    "建模需要考虑：     \n",
    "1.评分（准确率）问题     \n",
    "2.稳定性问题-在不同数据集都能得到稳定效果"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "original-astronomy",
   "metadata": {},
   "source": [
    "带交叉验证的学习曲线---- 找准确率高且方差还相对较小的点，这样的点泛化能力才是最强的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "august-russian",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.92105263, 0.90789474, 0.97368421, 0.94736842, 0.93421053,\n",
       "       0.92      ])"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score as CVS \n",
    "Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.2,random_state=420) \n",
    "clf = KNeighborsClassifier(n_neighbors=8) \n",
    "cvresult = CVS(clf,Xtrain,Ytrain,cv=6) \n",
    "#训练集对折6次，一共6个预测率输出 \n",
    "cvresult #每次交叉验证运行时估算器得分的数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "thermal-algebra",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9340350877192982"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "0.0004664512157586947"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 均值：查看模型的平均效果 \n",
    "cvresult.mean() \n",
    "# 方差：查看模型是否稳定 \n",
    "cvresult.var()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "entire-appraisal",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([<matplotlib.axis.XTick at 0x138c1c77a58>,\n",
       "  <matplotlib.axis.XTick at 0x138c1a2c630>,\n",
       "  <matplotlib.axis.XTick at 0x138c1a2c5f8>,\n",
       "  <matplotlib.axis.XTick at 0x138c1b847f0>,\n",
       "  <matplotlib.axis.XTick at 0x138c1b84cf8>,\n",
       "  <matplotlib.axis.XTick at 0x138c1a07b38>,\n",
       "  <matplotlib.axis.XTick at 0x138c1bd9f28>,\n",
       "  <matplotlib.axis.XTick at 0x138c1ca5fd0>,\n",
       "  <matplotlib.axis.XTick at 0x138c1bf8898>,\n",
       "  <matplotlib.axis.XTick at 0x138c1bf8d68>,\n",
       "  <matplotlib.axis.XTick at 0x138c1be9d68>,\n",
       "  <matplotlib.axis.XTick at 0x138c1c1e518>,\n",
       "  <matplotlib.axis.XTick at 0x138c1c1ea90>,\n",
       "  <matplotlib.axis.XTick at 0x138c1bf8d30>,\n",
       "  <matplotlib.axis.XTick at 0x138c1b84e48>,\n",
       "  <matplotlib.axis.XTick at 0x138c1c1e080>,\n",
       "  <matplotlib.axis.XTick at 0x138c1c06550>,\n",
       "  <matplotlib.axis.XTick at 0x138c1c06ac8>,\n",
       "  <matplotlib.axis.XTick at 0x138c21780f0>],\n",
       " <a list of 19 Text xticklabel objects>)"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "score = [] \n",
    "var = [] \n",
    "krange=range(1,20) #设置不同的k值，从1到19都看看 \n",
    "for i in krange: \n",
    "    #!!!!!!!!!k值不能过大，过小------后期score会不稳定---可以通过学习曲线得到\n",
    "    clf = KNeighborsClassifier(n_neighbors=i) \n",
    "    #!!!!!!!!!!!当样本分布很不均匀的时候可以通过设置weights = 'distence'进行调优\n",
    "#     clf = KNeighborsClassifier(n_neighbors=i,weights='distance') \n",
    "    #!!!!!!!!!折数不能过大，过小------影响方差的范围----一般设置为5折or6折，经验数据\n",
    "    cvresult = CVS(clf,Xtrain,Ytrain,cv=5) \n",
    "    score.append(cvresult.mean()) # 每次交叉验证返回的得分数组，再求数组均值 \n",
    "    var.append(cvresult.var()) \n",
    "_ = plt.plot(krange,score,color='k') \n",
    "_ = plt.plot(krange,np.array(score) + np.array(var)*2,c='red',linestyle='--') \n",
    "_ = plt.plot(krange,np.array(score) - np.array(var)*2,c='red',linestyle='--')\n",
    "plt.xticks(range(1,20))\n",
    "#由图可知k=10的时候效果最好，，得分是最高的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "green-annual",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9385964912280702"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_k10 = KNeighborsClassifier(n_neighbors=10)\n",
    "clf_k10 = knn_k10.fit(Xtrain,Ytrain)\n",
    "\n",
    "clf_k10.score(Xtest,Ytest)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "patient-monster",
   "metadata": {},
   "source": [
    "应该有三组数据：训练集、验证集和测试集。一般不单独另设验证集，而是像上面的例子，直接再测试集里面设"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "square-leave",
   "metadata": {},
   "source": [
    "### 归一化------距离类的模型特别讲究归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "sized-england",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x138c3c81b38>]"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x138c3c5a4e0>]"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x138c3c7cef0>]"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler as mms \n",
    "Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,y,test_size=0.2,random_state=420) \n",
    "#归一化 \n",
    "MMS_01=mms().fit(Xtrain) #求训练集最大/小值 \n",
    "MMS_02=mms().fit(Xtest)#求测试集最大/小值 \n",
    "#转换\n",
    "X_train=MMS_01.transform(Xtrain) \n",
    "X_test =MMS_02.transform(Xtest) \n",
    "score=[] \n",
    "var=[] \n",
    "for i in range(1,20): \n",
    "    clf=KNeighborsClassifier(n_neighbors=i) \n",
    "    cvresult=CVS(clf,X_train,Ytrain,cv=5) \n",
    "    # 交叉验证的每次得分 \n",
    "    score.append(cvresult.mean()) \n",
    "    var.append(cvresult.var()) \n",
    "plt.plot(krange,score,color=\"k\")\n",
    "plt.plot(krange,np.array(score)+np.array(var)*2,c=\"red\",linestyle=\"--\") \n",
    "plt.plot(krange,np.array(score)-np.array(var)*2,c=\"red\",linestyle=\"--\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "saved-constraint",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "score.index(max(score))+1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "prescribed-share",
   "metadata": {},
   "source": [
    "### 距离的惩罚"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bridal-gardening",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
